#include <bits/stdc++.h>

using namespace std;

// prim
// int main()
// {
//     int v, e;
//     int v1, v2, value;
//     cin >> v >> e;
//     vector<vector<int>> graph(v + 1, vector<int>(v + 1, 10001));
//     for (int i = 0; i < e; i++)
//     {
//         cin >> v1 >> v2 >> value;
//         graph[v1][v2] = value;
//         graph[v2][v1] = value;
//     }
//     vector<bool> visited(v + 1, false);
//     vector<int> min_distance(v + 1, 10001);
//     for (int i = 1; i < v; i++)
//     {
//         int distance = INT_MAX;
//         int index = -1;
//         for (int j = 1; j <= v; j++)
//         {
//             if (!visited[j] && min_distance[j] < distance)
//             {
//                 distance = min_distance[j];
//                 index = j;
//             }
//         }

//         visited[index] = true;

//         for (int j = 1; j <= v; j++)
//         {
//             if (!visited[j] && graph[index][j] < min_distance[j])
//             {
//                 min_distance[j] = graph[index][j];
//             }
//         }
//     }

//     int result = 0;
//     for (int i = 2; i <= v; i++)
//     {
//         result += min_distance[i];
//     }
//     cout << result << endl;
//     return 0;
// }

// kruskal
int v;
vector<int> father(10001, -1);

struct edge
{
    int v1, v2, value;
};

void init()
{
    for (int i = 1; i <= v; i++)
    {
        father[i] = i;
    }
}

int find(int u)
{
    return father[u] == u ? u : father[u] = find(father[u]);
}

bool same(int u, int v)
{
    u = find(u);
    v = find(v);
    if (u == v)
    {
        return true;
    }
    return false;
}

void join(int u, int v)
{
    u = find(u);
    v = find(v);
    if (u == v)
    {
        return;
    }
    father[v] = u;
}

int main()
{
    int e;
    cin >> v >> e;
    vector<edge> graph;
    while (e--)
    {
        edge side;
        int v1, v2, val;
        cin >> v1 >> v2 >> val;
        side.v1 = v1;
        side.v2 = v2;
        side.value = val;
        graph.push_back(side);
    }
    sort(graph.begin(), graph.end(), [](const edge &a, const edge &b)
         { return a.value < b.value; });

    init();
    int result = 0;
    for (auto side : graph)
    {
        if (same(side.v1, side.v2))
        {
            continue;
        }
        join(side.v1, side.v2);
        result += side.value;
    }
    cout << result << endl;
    return 0;
}